package persistence.daos;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import model.Adicional;
import model.Base;
import model.ItemPlan;
import model.Plan;
import model.Prepago;
import model.Usuario;
import persistence.ConnectionPool;

public class PlanDAO 
{
	public static void insert (Plan plan)
	{
		Connection con = ConnectionPool.getPoolConnection().getConnection();
		
		try
		{
			//Preparar sentencia insert en tabla destino
			String sentencia = "INSERT INTO PlanX VALUES (?,?,?,?,?)";
			PreparedStatement ps = null;
			ps = con.prepareStatement(sentencia);
			
			ps.setString(1,plan.getNombre());
			
			if(plan.getPermiteExcederse() == true)
				ps.setString(2,"1");
			else if(plan.getEstado() == false)
				ps.setString(2,"0");
			
			if(plan.getEstado() == true)
				ps.setString(3,"1");
			else if(plan.getEstado() == false)
				ps.setString(3,"0");
			
			if(plan instanceof Base)
				ps.setString(4,"PLAN_BASE");
			else if(plan instanceof Adicional)
				ps.setString(4,"PLAN_ADICIONAL");
			if(plan instanceof Prepago)
				ps.setString(4, "PLAN_PREPAGO");
			
			if(plan instanceof Prepago)
				ps.setDate(5,((Prepago) plan).getVencimientoSaldo());
			else
				ps.setDate(5,null);
			
			// Alta de los servicios.
			
			Vector<ItemPlan> items = plan.getItems();
			
			for(int i=0;i<items.size(); i++)
			{
				ItemPlanDAO.insert(items.elementAt(i),plan.getNombre());
			}
			
			ps.execute();
			
			ConnectionPool.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Plan: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Plan: " + e.getStackTrace());
				ConnectionPool.getPoolConnection().realeaseConnection(con);
	      }
	}
	public static Plan select (String NombrePlan)
	{

		Plan plan = null;
		//Obtener conexion BD 
		Connection con = ConnectionPool.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT * FROM PlanX WHERE Nombre = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,NombrePlan);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				if(result.getString("Tipo").equals("PLAN_BASE"))
				{
					plan = new Base();
					plan.setNombre(result.getString("Nombre"));
					
					if(result.getString("PermiteExcederse").equals("1"))
						plan.setPermiteExcederse(true);
					else 
						plan.setPermiteExcederse(false);
					
					if(result.getString("Estado").equals("1"))
						plan.setEstado(true);
					else 
						plan.setEstado(false);
					
					plan.setItems(selectItemPlanPlan(result.getString("Nombre")));
				}
				else if(result.getString("Tipo").equals("PLAN_ADICIONAL"))
				{
					plan = new Adicional();
					plan.setNombre(result.getString("Nombre"));
					
					if(result.getString("PermiteExcederse").equals("1"))
						plan.setPermiteExcederse(true);
					else 
						plan.setPermiteExcederse(false);
					
					if(result.getString("Estado").equals("1"))
						plan.setEstado(true);
					else 
						plan.setEstado(false);
					
					plan.setItems(selectItemPlanPlan(result.getString("Nombre")));
				}
				else // es prepago
				{
					plan = new Prepago();
					plan.setNombre(result.getString("Nombre"));
					
					if(result.getString("PermiteExcederse").equals("1"))
						plan.setPermiteExcederse(true);
					else 
						plan.setPermiteExcederse(false);
					
					if(result.getString("Estado").equals("1"))
						plan.setEstado(true);
					else 
						plan.setEstado(false);
					
					plan.setItems(selectItemPlanPlan(result.getString("Nombre")));
				}
					
				
			}
			
			ConnectionPool.getPoolConnection().realeaseConnection(con);
		
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Cliente: " + e.getStackTrace());
				ConnectionPool.getPoolConnection().realeaseConnection(con);
	      }
	      return plan;
	

	}
	
	/**Devuelve todos los itemsPlan para un plan dado
	 * */
	public static Vector<ItemPlan> selectItemPlanPlan (String NombrePlan)
	{
		Vector<ItemPlan> itemsPlan = new Vector<ItemPlan>();
		
		Plan plan = null;
		//Obtener conexion BD 
		Connection con = ConnectionPool.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT * FROM ItemPlan WHERE NombrePlan = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,NombrePlan);
			ResultSet result = ps.executeQuery();
			
			while (result.next()) // Mientras haya ItemsPlan
			{
				ItemPlan itemPlan= new ItemPlan();
				itemPlan.setCantidad(result.getFloat("Cantidad"));
				itemPlan.setCostoAdicional(result.getFloat("CostoAdicional"));
				itemPlan.setServicio(ServicioSimpleDAO.select(result.getString("NombreServicioSimple")));
				
				itemsPlan.add(itemPlan);
			}
			
			
		}
		 catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Cliente: " + e.getStackTrace());
				ConnectionPool.getPoolConnection().realeaseConnection(con);
	      }
		return itemsPlan;
	}
	
}
